package com.lgq.cfw.service.impl;

import com.lgq.cfw.bean.TablePermission;
import com.lgq.cfw.bean.TableUser;
import com.lgq.cfw.bean.example.TableUserExample;
import com.lgq.cfw.bean.example.TableUserExample.Criteria;
import com.lgq.cfw.dao.TablePermissionMapper;
import com.lgq.cfw.dao.TableUserMapper;
import com.lgq.cfw.service.UserService;
import com.lgq.cfw.util.MD5Util;
import com.lgq.cfw.util.MyStringUtils;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javafx.scene.control.Tab;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author Lin
 * @date 2019-02-04 15:59
 **/
@Service
public class UserServiceImpl implements UserService {


  @Autowired
  TableUserMapper tableUserMapper;

  @Autowired
  TablePermissionMapper tablePermissionMapper;

  /**
   * 注册
   * @param tableUser 前端获取的用户
   * @return 是否注册成功
   */
  @Override
  public boolean register(TableUser tableUser) {
    //对密码进行MD5加密
    tableUser.setUserpswd(MD5Util.digest(tableUser.getUserpswd()));
    //将账号赋值给username
    tableUser.setUsername(tableUser.getLoginacct());
    //存入创建日期
    tableUser.setCreatetime(MyStringUtils.formatDate(new Date()));
    //row代表影响的行数，如果是1那么表示成功
    int row=0;
    //需要捕获数据库异常，如果发生异常直接返回false
    try{
      //插入数据
       row=tableUserMapper.insertSelective(tableUser);
      System.out.println(row);
    }catch (Exception e){
      e.printStackTrace();
      return false;
    }
    return row==1;
  }

  /**
   * 该账号是否已经存在
   * @param loginacct 获取的账号
   * @return 布尔
   */
  @Override
  public boolean checkAccount(String loginacct) {
    //从数据库里查找
    TableUserExample tableUserExample=new TableUserExample();
    Criteria criteria=tableUserExample.createCriteria();
    criteria.andLoginacctEqualTo(loginacct);
    return tableUserMapper.countByExample(tableUserExample)==0;
  }

  /**
   * 登录逻辑
   * @param loginacct 账号
   * @param userpswd 密码
   * @return 账号和密码是否存在在数据库中
   */
  @Override
  public boolean login(String loginacct,String userpswd) {
    TableUserExample tableUserExample=new TableUserExample();
    Criteria criteria=tableUserExample.createCriteria();
    criteria.andLoginacctEqualTo(loginacct);
    criteria.andUserpswdEqualTo(MD5Util.digest(userpswd));
    return tableUserMapper.countByExample(tableUserExample)==0;
  }


  /**
   * 判断名字是否为空
   * @param loginName 获取到的名字
   * @return 是否为空
   */
  @Override
  public boolean getName(String loginName) {
    return !(MyStringUtils.isEmpty(loginName));
  }

  /**
   * 获取所有权限信息
   * @param loginacct 传入的登录账号值
   * @return 所有权限的集合
   */
  @Override
  public List<TablePermission> getAllAuthority(String loginacct) {
    //首先通过用户名获取用户id
    TableUserExample tableUserExample=new TableUserExample();
    Criteria criteria=tableUserExample.createCriteria();
    criteria.andLoginacctEqualTo(loginacct);
    List<TableUser> tableUserList = tableUserMapper.selectByExample(tableUserExample);
    Integer userId=tableUserList.get(0).getId();
    //通过用户id获取权限集合
    List<TablePermission> tablePermissionList=tablePermissionMapper.getPermissionByUserId(userId);
    //创建父菜单集合
    List<TablePermission> tableParentPermissionList=new ArrayList<>();
    //遍历用户权限集合 将父菜单抽取出来
    for (TablePermission tablePermissionParent : tablePermissionList) {
      //pid=0的是父菜单
      if (tablePermissionParent.getPid()==0){
        //再次遍历整个权限集合，将集合中父菜单id和该父菜单的id一样的加入该父菜单的子菜单集合中
        for (TablePermission tablePermissionChildren:tablePermissionList){
          if (tablePermissionChildren.getPid().equals(tablePermissionParent.getId())){
            tablePermissionParent.getChildrenPermissions().add(tablePermissionChildren);
          }
        }
        //将添加完的父菜单加入父菜单集合
        tableParentPermissionList.add(tablePermissionParent);
      }
    }
    //返回父菜单集合
    return tableParentPermissionList;
  }

  /**
   * 获取所有的用户
   * @return 所有用户的集合
   */
  @Override
  public List<TableUser> getAllUser() {
    return tableUserMapper.selectByExample(null);
  }

  /**
   * 获取符合查询条件的用户
   * @param searchInformation 查询条件
   * @return 集合
   */
  @Override
  public List<TableUser> searchUserByCriteria(String searchInformation) {
    TableUserExample tableUserExample=new TableUserExample();
    Criteria criteria=tableUserExample.createCriteria();
    criteria.andLoginacctLike("%"+searchInformation+"%");
    return tableUserMapper.selectByExample(tableUserExample);
  }

  /**
   * 删除用户
   *
   * @param userId 用户ID
   * @return 是否成功
   */
  @Override
  public boolean deleteUserById(Integer userId) {
    try {
      tableUserMapper.deleteByPrimaryKey(userId);
    } catch (Exception e) {
      e.printStackTrace();
      return false;
    }
    return true;
  }

  /**
   * 批量删除用户
   *
   * @param deleteIdList 传入list
   * @return 是否成功
   */
  @Override
  public boolean batchDeleteUser(List<Integer> deleteIdList) {
    TableUserExample tableUserExample = new TableUserExample();
    Criteria criteria = tableUserExample.createCriteria();
    criteria.andIdIn(deleteIdList);
    try {

      tableUserMapper.deleteByExample(tableUserExample);
    } catch (Exception e) {
      e.printStackTrace();
      return false;
    }
    return true;
  }

  /**
   * 通过id获取用户
   * @param userId 用户id
   * @return TableUser对象
   */
  @Override
  public TableUser getUserById(Integer userId) {
    return tableUserMapper.selectByPrimaryKey(userId);
  }

  /**
   * 通过id更新用户
   * @param tableUser 传入的用户
   */
  @Override
  public void updateUser(TableUser tableUser) {
    tableUserMapper.updateByPrimaryKeySelective(tableUser);
  }
}
